package models.services;

import java.sql.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import models.entities.DetalleOrden;
import models.entities.Orden;
import models.services.exc.EntityNotFoundException;
import models.services.utils.DBManager;
import org.apache.log4j.Logger;

public class ServicioOrdenes implements ICatalog<Orden> {

	private final static Logger logger = Logger
			.getLogger(ServicioOrdenes.class);

	@Override
	public boolean borrar(Orden entity) {
		DBManager manager = DBManager.getInstance();
		manager.borrar(entity.getId(), "ordenes");
		return false;
	}

	@Override
	public int guardarActualizar(Orden entity) {
		ServicioDetalleOrdenes servicioDetalles = new ServicioDetalleOrdenes();
		DateFormat format = new SimpleDateFormat("YYYY-mm-dd");
		String fechaCita = format.format(entity.getFechaCita());
		DBManager manager = DBManager.getInstance();
		String coms = entity.getComentarios();
		List<DetalleOrden> detalles = entity.getDetalles();
		String fecha = entity.getFechaOrden();
		int idCliente = entity.getIdCliente();
		int idEmpleado = entity.getIdEmpleado();
		boolean estado = entity.isEstado();
		String sql = "insert into ordenes values(null," + idCliente
				+ ",now(),'','" + coms + "'," + idEmpleado + "," + estado
				+ ",'" + fechaCita + "')";
		int res = manager.guardarActualizar(sql);
		for (DetalleOrden detalleOrden : detalles) {
			servicioDetalles.crearDetalle(detalleOrden);
		}
		return res;
	}

	@Override
	public Orden obtener(int id) throws EntityNotFoundException {
		DBManager manager = DBManager.getInstance();
		ServicioDetalleOrdenes servicioOrdenes = new ServicioDetalleOrdenes();
		String sql = "select * from ordenes where id =" + id;
		ResultSet rs = manager.consultar(sql);
		try {
			while (rs.next()) {
				Orden orden = new Orden();
				int clienteid = rs.getInt("clienteid");
				String comentarios = rs.getString("comentarios");
				String fechaOrden = rs.getString("fechaorden");
				// String folio = rs.getString("folio");
				int empleadoid = rs.getInt("empleadoid");
				boolean estado = rs.getBoolean("estado");
				String fechaCita = rs.getString("fechacita");
				List<DetalleOrden> detalles = servicioOrdenes
						.obtenerDetallesDe(id);
				orden.setComentarios(comentarios);
				orden.setDetalles(detalles);
				orden.setEstado(estado);
				orden.setFechaOrden(fechaOrden);
				orden.setId(id);
				orden.setIdCliente(clienteid);
				orden.setIdEmpleado(empleadoid);
				orden.setFechaCita(fechaCita);
			}
		} catch (Exception e) {
			logger.error(e.getCause(), e);
		}
		return null;
	}

	@Override
	public List<Orden> buscarPorNumero(String campo, int valor) {
		List<Orden> ordenes = new ArrayList<Orden>();
		DBManager manager = DBManager.getInstance();
		String sql = "select * from ordenes where " + campo + " = " + valor;
		ResultSet rs = manager.consultar(sql);
		return this.obtener(rs, ordenes);
	}

	@Override
	public List<Orden> buscarPorString(String campo, String valor) {
		List<Orden> ordenes = new ArrayList<Orden>();
		DBManager manager = DBManager.getInstance();
		String sql = "select * from ordenes where " + campo + " like '%"
				+ valor + "%'";
		ResultSet rs = manager.consultar(sql);
		return this.obtener(rs, ordenes);
	}

	private List<Orden> obtener(ResultSet rs, List<Orden> ordenes) {
		ServicioDetalleOrdenes servicioOrdenes = new ServicioDetalleOrdenes();
		try {
			while (rs.next()) {
				Orden orden = new Orden();
				int id = rs.getInt("id");
				int clienteid = rs.getInt("clienteid");
				String comentarios = rs.getString("comentarios");
				String fechaOrden = rs.getString("fechaorden");
				// String folio = rs.getString("folio");
				int empleadoid = rs.getInt("empleadoid");
				boolean estado = rs.getBoolean("estado");
				String fechaCita = rs.getString("fechacita");
				List<DetalleOrden> detalles = servicioOrdenes
						.obtenerDetallesDe(id);
				orden.setComentarios(comentarios);
				orden.setDetalles(detalles);
				orden.setEstado(estado);
				orden.setFechaOrden(fechaOrden);
				orden.setId(id);
				orden.setIdCliente(clienteid);
				orden.setIdEmpleado(empleadoid);
				orden.setFechaCita(fechaCita);
			}
		} catch (Exception e) {
			logger.error(e.getCause(), e);
		}
		return ordenes;
	}

	public List<Orden> obtenerDeRango(java.util.Date i, java.util.Date f) {
		ServicioDetalleOrdenes servicioOrdenes = new ServicioDetalleOrdenes();
		DBManager manager = DBManager.getInstance();
		List<Orden> ordenes = new ArrayList<Orden>();

		// DateFormat = Este objeto regresa un formato erroneo
		DateFormat format = new SimpleDateFormat("yyyy-mm-dd");
		// Los meses empiezan de 0 segun java.util.Date y segun SQL de 1
		int im = i.getMonth() + 1;
		int fm = f.getMonth() + 1;

		String iniciaStr = i.getYear() + "-" + ((im < 10) ? "0" + im : im)
				+ "-" + ((i.getDate() < 10) ? "0" + i.getDate() : i.getDate());
		String finalStr = f.getYear() + "-" + ((fm < 10) ? "0" + fm : fm) + "-"
				+ ((f.getDate() < 10) ? "0" + f.getDate() : f.getDate());
		String sql = "select * from ordenes where fechacita between '"
				+ iniciaStr + "' and '" + finalStr + "'";
		System.out.println("Consulta" + sql);
		ResultSet rs = manager.consultar(sql);

		try {
			while (rs.next()) {
				System.out.println("SIGUIENTE");
				Orden orden = new Orden();
				int id = rs.getInt("id");
				int clienteid = rs.getInt("clienteid");
				String comentarios = rs.getString("comentarios");
				int empleadoid = rs.getInt("empleadoid");
				boolean estado = rs.getBoolean("estado");
				String fechaCita = rs.getString("fechacita");
				String fechaOrden = rs.getString("fechaorden");

				List<DetalleOrden> detalles = servicioOrdenes
						.obtenerDetallesDe(id);
				orden.setComentarios(comentarios);
				orden.setFechaCita(fechaCita);
				orden.setDetalles(detalles);
				orden.setEstado(estado);
				orden.setFechaOrden(fechaOrden);
				orden.setId(id);
				orden.setIdCliente(clienteid);
				orden.setIdEmpleado(empleadoid);

				// Falto agreagr la orden a la lista
				ordenes.add(orden);
			}
		} catch (Exception e) {
			logger.error(e.getCause(), e);
			return null;
		}
		return ordenes;
	}

	public String generarFolioSiguiente() {
		DBManager manager = DBManager.getInstance();
		String consulta = "SELECT max(id) as numero FROM ordenes";
		ResultSet rs = manager.consultar(consulta);

		try {
			if (rs.next()) {
				// resultado=rs.getInt("numero");
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return null;
		// return "SYE"+resultado;
	}
}
